import { expect } from '@jest/globals';
import fs from 'fs';
import path from 'path';

import { initExecuteCommand, runHvigorFailAsync } from '../../common/common';
import { commonFileOperation } from '../../plugins/common-fun';
import {
  AbilityType,
  APIType,
  APIVersion,
  CaseLevel,
  LanguageType,
  ModuleTemplateType,
  RuntimeOSType,
  SDKType
} from '../../plugins/project-builder/models/constants';
import { TestCaseBuilder } from '../../plugins/task-builder/task-case-builder';
import { ProjectBuildOption, TestCaseFun } from '../../plugins/task-builder/test-case';
import { TestTaskOptionBuilder } from '../../plugins/task-builder/test-task-option';

const projectBuilderOption: ProjectBuildOption = {
  template: {
    sdk: SDKType.Single,
    runtimeOS: RuntimeOSType.HarmonyOS,
    apiVersion: APIVersion.API11,
    apiType: APIType.STAGE,
    language: LanguageType.ArkTs,
    abilityType: AbilityType.Application,
    entryTemplateType: ModuleTemplateType.EmptyAbility
  }
};

/**
 * 1、创建工程
 * 2、修改工程下entry模块下的module.json5 里的 key module 为其他key 。或者清空 module.json5文件
 * 3、有期望的报错提示
 *
 * @param {Project} project
 * @param {TestTaskOption} taskConfig
 * @param {ICaseRecord} record
 * @return res
 */
const testfun: TestCaseFun = async (project, taskConfig, record) => {
  const projectRoot = project.projectRootPath();
  // 1. 创建工程获取 entry 模块路径
  const entryRootPath = project.getModule('entry').moduleRootPath();

  // 2、修改 里面的module.json5 文件 的 module 字段为其他值
  const entryModuleJson5Path = path.resolve(entryRootPath, 'src/main/module.json5');
  // 修改 工程目录下的 hvigorfile.ts
  await commonFileOperation(entryModuleJson5Path, async (buffer) => {
    return buffer.toString().replace('\"module\":', '\"module1\":');
  });

  // 3、 执行构建
  const commands = initExecuteCommand({
    mode: 'module',
    product: 'default',
    tasks: 'assembleHap'
  });

  // 执行两遍，第一遍清除，第二遍 没有文件可以清除。
  const result1 = await runHvigorFailAsync(projectRoot, commands);
  record.addStep('修改entry 里面的 module.json5 文件 的 module 字段为 module1值', result1);
  expect(result1.stderr).toContain('Unable to obtain the module information');
  expect(result1.stderr).toContain('Make sure the module field is set correctly in the module.json5 file');
  expect(result1.stderr).toContain('BUILD FAILED');

  // 4、 清空 module.json5  文件
  await commonFileOperation(entryModuleJson5Path, async (buffer) => {
    return ' ';
  });
  // 5、 执行构建
  const result2 = await runHvigorFailAsync(projectRoot, commands);
  record.addStep('清空entry 模块下的 module.json5  文件', result2);
  expect(result2.stderr).toContain('JSON5: invalid end of input');
  expect(result2.stderr).toContain('BUILD FAILED');

  // 6、删除 module.json5  文件，
  fs.rmSync(entryModuleJson5Path);
  // 7、 执行构建
  const result3 = await runHvigorFailAsync(projectRoot, commands);
  record.addStep('删除 module.json5  文件', result3);
  // expect(result3.stderr).toContain('entry\\src\\main\\module.json5\' is not exist');
  // expect(result3.stderr).toContain('Detail: Make sure the module.type field is set correctly in the module.json5 file:');
  expect(result3.stderr).toContain('module.json5 file not found.');
  expect(result3.stderr).toContain('BUILD FAILED');
};

TestCaseBuilder.builder()
  .caseName('DTS2024020700898')
  // eslint-disable-next-line max-len
  .description('【DevEco Studio】【通用】【API】【未知类型】【win/mac】修改模块级module.json5里module标签为空或错误的，报错信息不清晰')
  .projectBuilderOption(projectBuilderOption)
  .taskConfig(TestTaskOptionBuilder.builder().caseLevel(CaseLevel.DTS).build())
  .testFun(testfun)
  .load();
